﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using Common.ControlDevice;

namespace Common.Tool
{
   // 委托类型的声明
    public delegate bool WatchFileFunc(string targetFilePath);

    class WatchFile
    {
        // 用于存放日志单元
        private static WatchFileFunc FuncDelegate = null;

        // 上一次文本数据
        public static Settings lastSetting = new Settings();//用来表示上一次读取到的最后一条数据
        // 上一次文本数据
        public static String lastData= String.Empty;//用来表示上一次读取到的最后一条数据

        // 机器人数据文件夹路径
        private static string path = @"Resources";
        private static string Path
        {
            get { return path; }
            set
            {
                path = value;
            }
        }

        // 机器人路径文件路径
        private static string targetFilepath = @"Resources\Config.json";
        private static string TargetFilePath
        {
            get { return targetFilepath; }
            set
            {
                targetFilepath = value;
            }
        }

        /** 
         * \brief 文件监控初始化函数 
         */
        public static void InitWatchFile(WatchFileFunc func)
        {
            FuncDelegate = func;
            FileSystemWatcher watcher = new FileSystemWatcher(path);//注意：这里的path是文件夹路径，不包含文件名
            watcher.EnableRaisingEvents = true;
            watcher.IncludeSubdirectories = true;
            watcher.Changed += new FileSystemEventHandler(FileWatcher_Changed);//文件变化时触发的事件      
        }

        /** 
           * \brief 文件监控变化函数 
           *
           * \param sender 事件触发者
           * \param e  特定事件
           */
        public static void FileWatcher_Changed(object sender, FileSystemEventArgs e)
        {
            bool vaild = true;
            (sender as FileSystemWatcher).EnableRaisingEvents = false;
            (sender as FileSystemWatcher).EnableRaisingEvents = true; //这样可以保证changed事件可以被重新触发。
            //启用一个任务线程来尽可能的减少changed事件处理时间
            System.Threading.Tasks.Task.Factory.StartNew(() =>
            {
               string strReg = "regularexpression";//正则表达式字符串，用于将对文件进行筛选，
                if (Regex.IsMatch(e.Name, strReg))
               {
                    lock (lastData)//锁定lastData，防止多个任务线程同时访问时造成lastData值的错乱
                    {
                        if (TargetFilePath == Path + e.Name)  // 仅针对日志文件进行监控
                        {
                            FileStream stream = File.Open(Path + e.Name, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                            StreamReader reader = new StreamReader(stream);//流读取器
                            try
                            {
                                //读取文件
                                string textString = reader.ReadToEnd();
                                vaild = FuncDelegate(TargetFilePath);
                                lastData = textString.Length.ToString();
                            }
                            catch
                            {
                                vaild = false;
                            }
                            finally
                            {
                                stream.Close();
                                reader.Close();
                                if (vaild)
                                {
                                    //RecordManager.SendRecordData(RecordType.Info, e.Name + "日志数据读取成功", "");
                                    //MessageBox.Show("日志数据读取成功");
                                }
                                else
                                {
                                    // RecordManager.SendRecordData(RecordType.Warn, e.Name + "日志数据读取失败", "");
                                }
                            }
                        }
                     }
                 }
            });
        }
    }
}
